package com.eyas.core.jdbc.utils;

import com.eyas.core.model.page.PageResult;
import org.springframework.jdbc.core.CallableStatementCallback;
import org.springframework.jdbc.core.PreparedStatementCallback;

import java.util.List;

/**
 * @Auther: 王龙龙
 * @Date: 2019/2/21 13:59
 * @Description:
 */
public interface JdbcOperate {
    /**
     * 实体类要求使用特定注解
     * @param model
     * @param <T>
     * @return
     */
    public <T> int update(T model);

    /**
     * 批量更新
     * @param models
     * @param <T>
     * @return
     */
    public <T> int[] batchUpdate(List<T> models);

    /**
     * 实体类要求使用特定注解
     * @param model
     * @param <T>
     * @return
     */
    public <T> int insert(T model);

    /**
     * 批量insert(这个还未实现insert后主键自动加入model中)
     * @param models
     * @param <T>
     * @return
     */
    public <T> int[] batchInsert(List<T> models);

    /**
     * 实体类要求使用特定注解
     * @param model
     * @param <T>
     * @return
     */
    public <T> int delete(T model);

    /**
     * 批量删除
     * @param models
     * @param <T>
     * @return
     */
    public <T> int[] batchDelete(List<T> models);


    public int update(String sql,Object... args);
    public int[] batchUpdate(String sql,List<Object[]> args);
    public int insert(String sql,Object... args);
    public int delete(String sql,Object... args);



    public <T> T executeSql(String sql, PreparedStatementCallback<T> action);
    public <T> T executeSql(String callString, CallableStatementCallback<T> action);
    public <T> T queryObject(String sql,Class<T> clazz,Object... args);
    public <T> List<T> queryList(String sql, Class<T> clazz, Object... args);
    public <T> PageResult<T> queryForPage(String sql, Class<T> clazz,int page,int limit, Object... args);

    public int update(String sql,List<?> args);
    public int insert(String sql,List<?> args);
    public int delete(String sql,List<?> args);
    public <T> T queryObject(String sql,Class<T> clazz,List<?> args);
    public <T> List<T> queryList(String sql, Class<T> clazz, List<?> args);
    public <T> PageResult<T> queryForPage(String sql, Class<T> clazz,int page,int limit, List<?> args);

    /**
     * 此方法为手动封装，已经过简单测试，建议使用成熟的ORM框架，目前系统集成了spring jpa
     * @param procedureModel
     * @param <T>
     * @return
     */
    public <T> T call(T procedureModel);
}
